<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // var a;

    // var  ES5以及以前 用于声明变量的关键词
    // let const  ES6新增  用于声明变量的关键词

    // 共同点:
    // 声明变量的关键词,都可以创建局部变量和全局变量

    // var a = 10;
    // let b = 20;
    // const c = 30;
    // console.log(a, b, c);

    // function fn() {
    //     var a = 10;
    //     let b = 20;
    //     const c = 30;
    //     console.log(a, b, c);
    // }
    // fn();


    // 区别:
    // (1) var声明的变量,有变量提升 ,  let和const声明的变量没有变量提升
    // (2) var声明的变量,可以重复声明,  let和const声明的变量,不能重复声明(同一个作用域),let声明的是变量可以重新赋值,const声明的是常数变量(常量),一经声明,无法修改(无法修改变量的值)
    // (3) ES6 新增块级作用域,块级作用域中let和const声明的变量都是局部变量, 块级作用域对var没有影响


    // 关于变量提升
    // console.log(a);
    // console.log(b); // 报错:Cannot access 'b' before initialization => 初始化之前无法访问b
    // console.log(c);  // 报错:Cannot access 'c' before initialization => 初始化之前无法访问c


    var a = 10;
    let b = 20;
    const c = 30;
    console.log(a, b, c);

    // 关于重复声明(声明之后再次声明)
    // var a = 100;
    // let b = 200;  //报错: Identifier 'b' has already been declared  => b已经被定义
    // const c = 200;   //报错: Identifier 'b' has already been declared  => b已经被定义
    // console.log(a);

    // 关于重新赋值
    // b = 200;
    // console.log(b);
    // c = 300;
    // console.log(c);  //报错: Assignment to constant variable.  对常数变量的赋值。






</script>

</html>